package com.itdianzi.controller.cargo;



import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import com.itdianzi.controller.base.BaseController;
import com.itdianzi.domain.cargo.Contract;
import com.itdianzi.domain.cargo.Packing;
import com.itdianzi.domain.cargo.PackingExample;
import com.itdianzi.domain.export.Export;
import com.itdianzi.domain.export.ExportExample;
import com.itdianzi.service.cargo.ContractService;
import com.itdianzi.service.cargo.ExportService;
import com.itdianzi.service.cargo.PackingService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@Controller
@RequestMapping("/cargo/packing")
public class PackingController extends BaseController {
    @Reference
    private ExportService exportService;

    @Reference
    private PackingService packingService;

    @Reference
    private ContractService contractService;

//    查询数据库的装箱单 跳转装箱管理页面 查询已报运的数据 进行显示 提交装箱单
@RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1")Integer page, @RequestParam(defaultValue = "10")Integer size){
//    获取登录的用户的职位表示
    Integer degree = loginUser.getDegree();
//    如果是4 表示普通的员工 只显示自己的数据
    if (degree==4){
        PackingExample packingExample = new PackingExample();
        PackingExample.Criteria criteria = packingExample.createCriteria();
        criteria.andCompanyIdEqualTo(companyId);
        criteria.andCreateByEqualTo(loginUser.getId());
        PageInfo pageInfo = packingService.findByPage(packingExample, page, size);
        request.setAttribute("page",pageInfo);
        return "cargo/packing/packing-list";
//        如果是3 查询本部门的所有提交的上来数据 草稿的数据就不看了 只需要对数据进行审核就可以了
    }else if(degree==3){
        PackingExample packingExample = new PackingExample();
        PackingExample.Criteria criteria = packingExample.createCriteria();
        criteria.andCompanyIdEqualTo(companyId);
        criteria.andStateEqualTo(1L);
        criteria.andCreateDeptEqualTo(loginUser.getDeptName());
        PageInfo pageInfo = packingService.findByPage(packingExample, page, size);
        request.setAttribute("page",pageInfo);
        System.out.println(pageInfo.getList());
        return "cargo/packing/packing-list";
    }else {
        PackingExample packingExample = new PackingExample();
        PackingExample.Criteria criteria = packingExample.createCriteria();
        criteria.andCompanyIdEqualTo(companyId);
        PageInfo pageInfo = packingService.findByPage(packingExample, page, size);
        request.setAttribute("page", pageInfo);
        return "cargo/packing/packing-list";
    }

    }
//     跳转装箱添加页面 查询已报运的数据 进行显示 添加装箱单
    @RequestMapping("/toAdd")
    public String toAdd(@RequestParam(defaultValue = "1")Integer page, @RequestParam(defaultValue = "10")Integer size){
//    查询 公司id 和状态已报运（state=2）的数据
        ExportExample exportExample = new ExportExample();
        ExportExample.Criteria criteria = exportExample.createCriteria();
        criteria.andCompanyIdEqualTo(companyId);
        criteria.andStateEqualTo(2L);
        PageInfo pageInfo = exportService.findAll(exportExample, page, size);
        request.setAttribute("page",pageInfo);
        return "cargo/packing/packing-add";
    }

//    生成报运单 添加到数据库
    @RequestMapping("/edit")
    public String edit(Packing packing){
        //   把变量定义到外面 这个是装箱港
        String shipmentPort = "";
//         定义一个变量表示运输方式
        String transportMode = "";
        // 先定义一个这个变量接收第一个目的地 然后和后面的去对比 这个就是目的港的数据
        String temp = "";
    if(StringUtils.isBlank(packing.getPackingListId())) {
        if (packing.getExportIds()!=null) {
//    判断目的港是不是一个 先获取export所有的id 查询这些报运单的目的地
            String exportIds = packing.getExportIds();
            String[] split = exportIds.split(",");
//        定义一个集合把每个报运单的目的地存进去
            List<String> destinationPort = new ArrayList<>();
//        遍历数组 放到集合的里面去并拿出 里面的数据
            for (String id : split) {
                Export export = exportService.findById(id);
                destinationPort.add(export.getDestinationPort());
                shipmentPort = export.getShipmentPort();
                transportMode = export.getTransportMode();
            }
//用定义的临时变量接收第一个目的地 然后和后面的去对比 这个就是目的港的数据
            for (int i = 0; i < destinationPort.size(); i++) {
                if (i == 0) {
//                    在集合里拿出来第一个目的港赋值给临时变量 当做比较的标准
                    temp = destinationPort.get(i);
                }
                boolean equals = temp.equals(destinationPort.get(i));
//            如果这个目的港和第一个不同 就返回提示信息 在跳到添加页面去
                if (!equals) {
                    request.setAttribute("falg", 1);
                    return "forward:/cargo/packing/toAdd.do";
                }
            }
        }
//        添加装箱港数据和目的港数据进去
        packing.setShipmentPort(shipmentPort);
        packing.setDestinationPort(temp);
//        运输方式
        packing.setTransportMode(transportMode);
//    向对象中添加 公司id 名称 部门信息
        packing.setCompanyId(companyId);
        packing.setCompanyName(companyName);
        packing.setCreateDept(loginUser.getDeptName());
        packing.setCreateBy(loginUser.getId());
        packingService.save(packing);
        System.out.println(packing);
        return "redirect:/cargo/packing/list.do";
//        如果有id 就是修改的方法 去修改就可以了
    }else {
//        修改的后也要判断一下是不是一个目的港
//    判断目的港是不是一个 先获取export所有的id 查询这些报运单的目的地
        String exportIds = packing.getExportIds();
        String[] split = exportIds.split(",");
//        定义一个集合把每个报运单的目的地存进去
        List<String> destinationPort = new ArrayList<>();
//        遍历数组 放到集合的里面去并拿出 里面的数据
        for (String id : split) {
            Export export = exportService.findById(id);
            destinationPort.add(export.getDestinationPort());
            shipmentPort = export.getShipmentPort();
            transportMode = export.getTransportMode();
        }
//用定义的临时变量接收第一个目的地 然后和后面的去对比 这个就是目的港的数据
        for (int i = 0; i < destinationPort.size(); i++) {
            if (i == 0) {
//                    在集合里拿出来第一个目的港赋值给临时变量 当做比较的标准
                temp = destinationPort.get(i);
            }
            boolean equals = temp.equals(destinationPort.get(i));
//            如果这个目的港和第一个不同 就返回提示信息 在跳到添加页面去
            if (!equals) {
                request.setAttribute("falg", 1);
                return "forward:/cargo/packing/toUpdate.do?id="+packing.getPackingListId();
            }
        }
//        添加装箱港数据和目的港数据进去
        packing.setShipmentPort(shipmentPort);
        packing.setDestinationPort(temp);
//        运输方式
        packing.setTransportMode(transportMode);
        packingService.update(packing);
        return "redirect:/cargo/packing/list.do";
      }
    }

//修改点击提交报运单的状态
    @RequestMapping("/submit")
    public String submit(String id){
        Packing packing = packingService.findById(id);
            packing.setState(1L);
            packingService.update(packing);
            return "redirect:/cargo/packing/list.do";

    }
//    查询这个装箱运单
    @RequestMapping("/toView")
    public String toView(String id,@RequestParam(defaultValue = "1")Integer page, @RequestParam(defaultValue = "10")Integer size){
        System.out.println(packingService+"qqqqqqqqqqqqqqqqqqqq");
        Packing packing = packingService.findById(id);
        request.setAttribute("packing",packing);
//        获取当前装箱单下的报运单id 切割成数组
        String exportIds = packing.getExportIds();
        String[] split = exportIds.split(",");
        ExportExample exportExample = new ExportExample();
        ExportExample.Criteria criteria = exportExample.createCriteria();
        criteria.andCompanyIdEqualTo(companyId);
//        查询当前装箱单下的报运单数句 参数需要集合 把数组转成集合 这样能查询多个id中的数据回来
        criteria.andIdIn(Arrays.asList(split));
        PageInfo pageInfo = exportService.findAll(exportExample, page, size);
        request.setAttribute("page",pageInfo);
        return "cargo/packing/packing-view";

    }

//    跳转修改页面去
    @RequestMapping("/toUpdate")
    public String toUpdate(String id,@RequestParam(defaultValue = "1")Integer page, @RequestParam(defaultValue = "10")Integer size){
        System.out.println(packingService+"sdsdsdsddssdsdsds");
        Packing packing = packingService.findById(id);
        request.setAttribute("packing",packing);
//        查询报运单的信息 需要查询出已经报运的和显示装箱的数据
        ExportExample exportExample = new ExportExample();
        ExportExample.Criteria criteria = exportExample.createCriteria();
        criteria.andCompanyIdEqualTo(companyId);
        criteria.andStateBetween(2L,3L);
        PageInfo pageInfo = exportService.findAll(exportExample, page, size);
        request.setAttribute("page",pageInfo);
        return "cargo/packing/packing-update";

    }
//    根据id删除装箱单
    @RequestMapping("/delete")
    public String delete(String id){
        Packing packing = packingService.findById(id);
        if (loginUser.getDegree()==4 && packing.getState()!=0){
            request.setAttribute("del",1);
            return "forward:/cargo/packing/list.do";
        }
        if (packing.getState()==2){
            request.setAttribute("del",2);
            return "forward:/cargo/packing/list.do";
        }
        packingService.delete(id);
        return "redirect:/cargo/packing/list.do";
    }
//    修改点击装箱的
    @RequestMapping("/submitPa")
    public String submitPa(String id){
//        根据id获取当前装箱单对象 判断里面的数值是不是1 是1在进行更改 同时需要更改的是合同状态和报运单状态改成3
        Packing packing = packingService.findById(id);
        Long state = packing.getState();
        if (state==0){
            request.setAttribute("flag",1);
            return "forward:/cargo/packing/list.do";
        }else {
//            更改装箱单的状态
            packing.setState(2L);
            packingService.update(packing);
//            找到装箱单里面的每一个 报运单id修改报运单的状态去 ，先切割id 然后循环切割后的数组 获取每一个export对象 修改state数值 在调用方法修改
            String exportIds = packing.getExportIds();
            String[] split = exportIds.split(",");
            for (String eid : split) {
                Export export = exportService.findById(eid);
                System.out.println(export);
                export.setState(3);
                exportService.update(export);
//                找到报运单里面的合同id 还是进行切割 循环更改里面的状态去
                String contractIds = export.getContractIds();
                String[] split1 = contractIds.split(",");
                for (String cid : split1) {
                    Contract contract = contractService.findById(cid);
                    contract.setState(3);
                    contractService.update(contract);
                }
            }
            return "redirect:/cargo/packing/list.do";
        }
    }
//    点击取消进行装箱单的 驳回修改state的状态值
    @RequestMapping("/cancel")
    public String cancel(String id){
        Packing packing = packingService.findById(id);
        packing.setState(0L);
        packingService.update(packing);
        return "redirect:/cargo/packing/list.do";
    }
}
